#include "../coredef.h"
#include "cppdef.h"




/******************************************************************
* 関 数 名 : CppPragmaMain
* 機    能 :
* 引    数 : VOID
* 戻 り 値 : S4
* 	　　　:１．　正常終了時：	COEXIT_SUCCESS
* 　　　　　 ：２．　致命エラー：	COEXIT_FATAL
*
* 詳細内容 :
*******************************************************************/
S4 CppPragmaMain(VOID)
{
	U2 kindRet = TRUE;
	S4 nNewDirInfo = 0;
	S4 getMax = 0;
	S4 pragmaMsgLoc = 0;
	S4 RetInt;
	PSZ buf = NULL;
	S4 nextTokenRet = TRUE;
	BOOL bSpace = TRUE;

	/* テーブルKIND_TRUEFALSESTATの最後の行の属性USHORT_TRUEFALSEを判断 */
	/* 処理対象になるかどうかチェック */
	getMax = stCppDirectiveIFGroupAccess.getMax();
	kindRet = stCppDirectiveIFGroupAccess.state.get( getMax );
	if (kindRet != TRUE)
	{
		FATAL_ON_FATAL(CppTokensDelAll());
		return(COEXIT_SUCCESS);
	}
	/* テーブルKIND_DIRECTIVEINFOに1行を追加する */
	FATAL_ON_FALSE(stCoreDirectiveInfoAccess.alloc(1));
	/* テーブルKIND_DIRECTIVEINFOの追加した行のULONG_DIRECTIVEKIND属性に　CPPDEF_INCを設定する  */
	nNewDirInfo = stCoreDirectiveInfoAccess.getMax();
	stCoreDirectiveInfoAccess.kind.set(nNewDirInfo, CPPDEF_PRAGMA);
	/* 位置情報取得し、設定 */
	RetInt = CppLocSetDirectiveScope(nNewDirInfo);
	if( RetInt != COEXIT_SUCCESS )
	{
		return RetInt;
	}

	if( CppPragma )
	{
		FATAL_ON_FATAL(CppPragma());
	}
	/* バッファーbufReadの文字数＋１を「PRAGMA命令位置」に格納 */
	pragmaMsgLoc =0;


	nextTokenRet = CppTokenGetNextToken( FALSE, FALSE );
	while( nextTokenRet == COEXIT_SUCCESS )
	{
		kindRet = stCppTokenAccess.tokenKind.get( CUR_TOKEN_INDEX );
		if( kindRet == xPPTOKEN_NEXTLINE )
		{
			break;
		}else if( kindRet == xPPTOKEN_HSPACE || kindRet == xPPTOKEN_VSPACE )
		{
			if( bSpace == FALSE ){
				pragmaMsgLoc = stCppLabelStrAccess.appendStr( pragmaMsgLoc, " " );
				bSpace = TRUE;
			}
		}else{
			/* 現在の前処理字句の文字列を取得して、バッファーbufReadに追加する */
			buf = stCppTokenAccess.name.get( CUR_TOKEN_INDEX );
			if( str_length( buf ) > 0 ){
				pragmaMsgLoc = stCppLabelStrAccess.appendStr( pragmaMsgLoc, buf );
				bSpace = FALSE;
			}
		}
		nextTokenRet = CppTokenGetNextToken( FALSE, FALSE );
	}
	stCoreDirectiveInfoAccess.str_param.set( nNewDirInfo, stCppLabelStrAccess.getStr( pragmaMsgLoc ) );

	/* バッファーKIND_BUFSYMNAME　をクリアする */
	FATAL_ON_FATAL(CppTokensDelAll());

	return( COEXIT_SUCCESS );

}

